package cn.demo.text.editor.frame;

import cn.demo.text.editor.constant.Str;
import cn.demo.text.editor.panel.LineNumberPanel;
import cn.demo.text.editor.strategy.menu.FileMenu;
import cn.demo.text.editor.strategy.menu.action.Action;
import cn.demo.text.editor.strategy.menu.action.ActionFactory;

import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TextEditor extends JFrame implements ActionListener {

    private JTextArea textArea = null;

    public TextEditor() {
        textArea = new JTextArea();
        textArea.setFont(new Font(Str.REGULAR_SCRIPT, Font.BOLD, 22));
        textArea.setMargin(new Insets(10, 10, 10, 10));
        // 添加光标监听器
        textArea.addCaretListener(e -> highlightCurrentLine());

        JMenuBar jmb = new JMenuBar();
        JMenu jm = new FileMenu(this);
        jmb.add(jm);

        JScrollPane jScrollPane = new JScrollPane();// 创建滚动条面板
        // 分别设置水平和垂直滚动条自动出现 （默认是这种）
        jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        jScrollPane.setViewportView(textArea);
        // 添加行号组件
        LineNumberPanel lineNumberPanel = new LineNumberPanel(textArea);
        jScrollPane.setRowHeaderView(lineNumberPanel);

        this.setLayout(new BorderLayout());

        this.setJMenuBar(jmb);

        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setSize(1024, 768);
        this.setVisible(true);
        /*
         * 设置窗口的相对位置。
         * 如果 comp 整个显示区域在屏幕内, 则将窗口放置到 comp 的中心;
         * 如果 comp 显示区域有部分不在屏幕内, 则将该窗口放置在最接近 comp 中心的一侧;
         * comp 为 null, 表示将窗口放置到屏幕中心。
         */
        this.setLocationRelativeTo(null);
        this.add(jScrollPane);
    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {

        try {
            String str = actionEvent.getActionCommand();
            Action action = ActionFactory.getAction(str);
            action.operate(textArea);
        } catch (Exception e) {
            new TipTextField(e.getMessage());
            e.printStackTrace();
        }
    }

    // 高亮当前行的方法
    private void highlightCurrentLine() {
        try {
            Highlighter highlighter = textArea.getHighlighter();
            highlighter.removeAllHighlights();

            int caretPosition = textArea.getCaretPosition();
            int start = textArea.getLineStartOffset(textArea.getLineOfOffset(caretPosition));
            int end = textArea.getLineEndOffset(textArea.getLineOfOffset(caretPosition));

            // 设置巧克力黄背景色
            Color chocolateYellow = new Color(255, 228, 181);
            highlighter.addHighlight(start, end, new DefaultHighlighter.DefaultHighlightPainter(chocolateYellow));
        } catch (BadLocationException ex) {
            ex.printStackTrace();
        }
    }
}